// 日志封装
import log4js from 'log4js'

enum LevelInfo{
    'trace' = 'trace',
    'debug' = 'debug',
    'info' = 'info',
    'warn' = 'warn',
    'error' = 'error',
    'fatal' = 'fatal'
}


class LogUtil{
    static logUtil:LogUtil = new LogUtil()
    // logInstance!: log4js.Logger
    logInstance!: log4js.Logger
    private constructor(){
        this.config() // 调用级别配置方法
    }

    // config 配置
    config(){
        log4js.configure({
            // 记录日志输出的地址，控制台或者文件里
            appenders:{
                // 指定控制台输出
                console:{type:'console'},
                // debug输出文件
                debug_file:{type:'file',filename:'src/log/debug.log'},
                // info输出文件
                info_file:{type:'file',filename:'src/log/info.log'},
                error_file:{type:'file',filename:'src/log/error.log'}
            },
            // 配置日志的类别，可以引用上边的日志将日志输出到对应的地方
            categories:{
                // debug级别
                default:{
                    appenders:['console','debug_file'],
                    level:LevelInfo.debug
                },
                // info级别
                info:{
                    appenders:['console','info_file'],
                    level:LevelInfo.info
                },
                warn:{
                    appenders:['console'],
                    level:LevelInfo.warn
                },
                error:{
                    appenders:['console','error_file'],
                    level:LevelInfo.error
                }
            }
        })
    }

    // 获取log实例方法
    gtetCategories(level:LevelInfo){
        // 获取log实例
        this.logInstance = log4js.getLogger(level)
    }

    debug(input:string){
        // 先获取实例
        this.gtetCategories(LevelInfo.debug)
        // 在输出日志
        this.logInstance.debug(input)
    }
    info(input:Error|string){
        // 先获取实例
        this.gtetCategories(LevelInfo.info)
        // 在输出日志
        this.logInstance.info(input)
    }
    warn(input:string){
        // 先获取实例
        this.gtetCategories(LevelInfo.warn)
        // 在输出日志
        this.logInstance.warn(input)
    }
    error(input:string){
        // 先获取实例
        this.gtetCategories(LevelInfo.error)
        // 在输出日志
        this.logInstance.error(input)
    }
}


export default LogUtil.logUtil